git object
.git/objects/内にある
一つ一つのファイルが一つ一つのGItオブジェクト
Gitオブジェクトの集合をGitオブジェクトデータベースなどと呼ぶ
オブジェクトのIDと中身
GitオブジェクトはIDで区別される
IDはGitオブジェクト名でもある
IDは40文字の16進数
.git/objects/内にこんな風にずらっとディレクトリが並んでいるが、これはIDの頭文字2文字になってる
https://gyazo.com/fe27b3d90a2f3a98a66d217a277942bb
中身は38文字のタイトルのオブジェクトになってる
オブジェクトの種類+(スペース)+データのサイズ+(\0)+データという入力を
SHA1でハッシュにしたものが40文字のID
Zlibで圧縮したものが中身
http://cdn-ak.f.st-hatena.com/images/fotolife/k/koseki2/20140420/20140420183844.png http://koseki.hatenablog.com/entry/2014/04/22/inside-git-1#2
IDはデータの中身のハッシュで決まるので、
ファイルの中身が同じなら、全世界の誰が作っても同じIDになる
後述するblobオブジェクトはファイルの中身を示すが、
A.txtとB.txtが全く同じ中身なら、blobオブジェクトは一つで済む
treeオブジェクトにはこんな風に書けばいい
code:tree
100644 A.txt \0 72943a16fb2c8f38f9dde202b7a70ccc19c52f34
100644 B.txt \0 72943a16fb2c8f38f9dde202b7a70ccc19c52f34
オブジェクト
Gitのデータベースを構成するもの
4種類ある
これら全てが.git/objects/内にごちゃまぜに入っている
名前だけ見てもどの種類のオブジェクトなのかは区別できない
blobオブジェクト
ファイルに対応
$ git addしたときに作成される
treeオブジェクト
commitオブジェクト
tagオブジェクト
tagに対応
ネタ
https://github.com/CouleeApps/git-power
意図的にcommit hashの上位7桁を0にするやつ
#??
ハッシュ化しているならどうやって差分を見ることができるの?
オブジェクトからどうやって実コードを復元してるの?
ハッシュって可逆だっけ?
くそでかプロジェクト全てのコードを毎回ハッシュしてんの?
流石にそんなこと無いよね?mrsekut.icon
Chromeのコードとかcommitするのにめっちゃ時間かかる、とかあるの?
参考
Git の仕組み (1) - こせきの技術日記
詳しい。イラストがわかりやすい
https://git-scm.com/book/ja/v2/Gitの内側-Gitオブジェクト
https://git-scm.com/book/ja/v2/Git-のさまざまなツール-リビジョンの選択
https://engineering.mercari.com/blog/entry/2016-02-08-173000/
https://tokyo.oyasumi.club/2019/07/07/03-making-git-commit.html